/*************************************************************************************
 *
 *	模块名称 : 词典模块
 *	文件名称 : dict.c
 *	版   本 : V1.0
 *	说   明 : 根据用户输入单词查找词典并打印单词类型和释义。
 *	修改记录 :
 *		     版本号       日期         作者        说明
 *	         V1.0     2022-05-12      YT        发布
 *
 *	Copyright (C), 2022-2030, xxxx
 *
 *************************************************************************************/

#include "inc.h"
#include "dict.h"

static FILE *gs_fpDict = NULL;     // 定义 词典文件流指针 为全局静态变量
static sqlite3 *gs_dbDict = NULL;  // 定义 词典数据库指针 为全局静态变量
static long gs_DictLen = 0;        // 定义 词典长度 为全局静态变量           

int dictInit()
{
    if( NULL == ( gs_fpDict = fopen( DICT_FILE_NAME, "r" ) ) )
    {
        perror("Fail dictInit");
        return -1;
    }

    fseek( gs_fpDict, 0, SEEK_END );
    gs_DictLen = ftell( gs_fpDict );
    rewind( gs_fpDict );

    int Ret = sqlite3_open( DICT_DB_NAME, &gs_dbDict );
    if ( Ret != SQLITE_OK )
    {
        fprintf( stderr, "fail sqlite3_open: %s\n", sqlite3_errmsg( gs_dbDict ) );
        return -1;
    }

    char SqlCreateStatements[1024];
    sprintf( SqlCreateStatements, 
    "CREATE TABLE DTABLE(ID INTEGER PRIMARY KEY AUTOINCREMENT, Word CHAR(200), Type CHAR(200),Expln CHAR(200));");
                    //MAX_WORD_SIZE, MAX_TYPE_SIZE, MAX_EXPLN_SIZE );

    char * strErrMsg = NULL;
    Ret = sqlite3_exec( gs_dbDict, SqlCreateStatements, NULL, 0, &strErrMsg );
    if ( Ret != SQLITE_OK )
    {
        fprintf( stderr, "fail sqlite3_exec create: %s\n", strErrMsg );
        sqlite3_free( strErrMsg );
        return -1;
    }

    return 0;

}


int dictClose()
{
    if ( fclose(gs_fpDict) != 0 )
    {
        perror("Fail dictClose");
        return -1;
    }

    sqlite3_close( gs_dbDict );

    return 0;

}

/**************************************************************************
 * 函数名称:  dictGetWord
 * 函数说明： 从词典中获取单词字符串
 * 参   数： strWord 保存单词的字符串指针 
 * 返回值 :  单词字符串指针
 *          NULL 表示已经到了文件结尾
 *************************************************************************/
char * dictGetWord( char strWord[] )
{
    char *pDict = NULL;
    static long s_Counter = 0;

    pDict = fgets( strWord, MAX_WORD_STR_SIZE, gs_fpDict );
    if ( NULL == pDict )
    {
        return NULL;
    }
    
    long DictCurrent = ftell( gs_fpDict );
    printf( "%.1lf%%  --- %6ld\r", (double)DictCurrent/(double)gs_DictLen * 100.0, s_Counter++ );
    fflush( stdout );

    return strWord;

}


int dictFormatWord( char strUsrWord[], WordFormatTypedef * pFmtWord )
{
    char *pDict = NULL;
    memset( pFmtWord, 0, sizeof(WordFormatTypedef) ); //清空单词结构体

    if ( NULL != ( pDict = strtok( strUsrWord, " " ) ) )            //获取词典单词字段
    {
        strcpy( pFmtWord->Word, pDict );                //将字典单词字段存入目标单词结构体Word
    }
        
    if ( NULL != ( pDict = strtok(NULL, " ") ) )    //获取到合法的词典类型字Type
    {
        strcpy( pFmtWord->Type, pDict );            //将字典类型字段存入目标单词结构体
    }
 
    if ( NULL != ( pDict = strtok(NULL , "\n") ) )   //获取到合法的字典解释字段
    {
        strcpy( pFmtWord->Expln, pDict );            //将词典解释字段存入目标单词结构体
    }

    return 0;

}


int dictSaveWordDb( const WordFormatTypedef *pFmtWord )
{

/*
typedef struct 
{
    char Word[MAX_WORD_SIZE];        //单词本身
    char Type[MAX_TYPE_SIZE];        //单词类型
    char Expln[MAX_EXPLN_SIZE];      //单词释义
}WordFormatTypedef;  //单词结构体
*/
    char SqlInsertStatements[1024]={0};
    char * strErrMsg;
    int Ret;

    sprintf( SqlInsertStatements,
            "INSERT INTO DTABLE VALUES(NULL, \"%s\", \"%s\", \"%s\");",
            pFmtWord->Word,
            pFmtWord->Type,
            pFmtWord->Expln );

    Ret = sqlite3_exec( gs_dbDict, SqlInsertStatements, NULL, 0, &strErrMsg );
    if ( Ret != SQLITE_OK )
    {
        fprintf( stderr, "fail sqlite3_exec insert: %s\n", strErrMsg );
        sqlite3_free( strErrMsg );
        return -1;
    }

    return 0;
}


